# 指定编译器
CROSS_COMPILE ?= arm-linux-gnueabihf-

CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump

# 例程名字
TARGET ?= key

# 指定输出目录
OUTPUT_DIR := bin

# 指定编译选项
CFLAGS := -Wall -O2

# 工程的头文件目录
INCDIRS :=  imx6ul  \
			bsp/clk \
			bsp/led \
			bsp/delay \
			bsp/beep \
			bsp/gpio \
			bsp/key

# 工程的所有 .c 和 .S 文件目录
SRCDIRS :=  project \
			bsp/clk \
			bsp/led \
			bsp/delay \
			bsp/beep \
			bsp/gpio \
			bsp/key

# 给 INCDIRS 中的每个目录添加 -I
INCLUDE := $(patsubst %, -I %, $(INCDIRS))

# 保存工程中所有的 .S 汇编文件,包含绝对路径
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
# 保存工程中所有的 .c 文件，包含绝对路径
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

# 保存工程中所有的 .S 汇编文件,仅保存文件名，不包含绝对路径
SFILENDIR := $(notdir $(SFILES))
# 保存工程中所有的 .c 文件,仅保存文件名，不包含绝对路径
CFILENDIR := $(notdir $(CFILES))

# .S 文件编译后对应的 .o 文件目录
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
# .c 文件编译后对应的 .o 文件目录
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
# 编译后文件输出目录
OBJS  := $(SOBJS) $(COBJS)

# 指定搜索目录
VPATH := $(SRCDIRS)

.PHONY:clean

$(OUTPUT_DIR)/$(TARGET).bin : $(OBJS)
	$(LD) -T imx6ul.lds -o $(OUTPUT_DIR)/$(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(OUTPUT_DIR)/$(TARGET).elf $@
	$(OBJDUMP) -D -m arm $(OUTPUT_DIR)/$(TARGET).elf > $(OUTPUT_DIR)/$(TARGET).dis

$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

clean:
	rm -rf $(OUTPUT_DIR)/$(TARGET).elf $(OUTPUT_DIR)/$(TARGET).dis $(OUTPUT_DIR)/$(TARGET).bin $(COBJS) $(SOBJS) 
